package hibernate;

import java.util.Calendar;
import java.util.List;
import negocio.Agenda;
import negocio.Especialidad;
import negocio.Medico;
import negocio.ObraSocial;
import negocio.Paciente;
import negocio.Turno;
import daos.AgendaDAO;
import daos.EspecialidadDAO;
import daos.MedicoDAO;
import daos.ObraSocialDAO;
import daos.PacienteDAO;
import daos.TurnoDAO;

public class Facade {

	private static Facade instancia;
	private AgendaDAO agendaDAO;
	private TurnoDAO turnosDAO;
	private ObraSocialDAO obraSocialDAO;
	private MedicoDAO medicoDAO;
	private EspecialidadDAO especialidadDAO;
	private PacienteDAO pacienteDAO;
	
	private Facade(){
		agendaDAO = AgendaDAO.getInstancia();
		turnosDAO = TurnoDAO.getInstancia();
		obraSocialDAO = ObraSocialDAO.getInstancia();
		medicoDAO = MedicoDAO.getInstancia();
		especialidadDAO = EspecialidadDAO.getInstancia();
		pacienteDAO = PacienteDAO.getInstancia();
	}
	
	public static Facade obtenerInstancia(){
		if(instancia == null)
			instancia = new Facade();
		return instancia;
	}
	
	public void guardarAgenda(Agenda agenda){
		agendaDAO.guardarAgenda(agenda);
	}
	
	public Agenda obtenerAgenda(Medico medico){
		return agendaDAO.obtenerAgenda(medico);
	}
	
	public List<Agenda> obtenerAgendas(){
		return agendaDAO.obtenerAgendas();
	}
	
	public void eliminarAgenda(Agenda ag){
		agendaDAO.eliminarAgenda(ag);
	}
	
	public void guardarTurno(Turno t){
		turnosDAO.guardarTurno(t);
	}
	
	public void actualizarTurno(Turno t){
		turnosDAO.actualizarTurno(t);
	}
	
	public void guardarTurnos(List<Turno> turnos){
		turnosDAO.guardarTurnos(turnos);
	}

	public void actualizarTurnos(List<Turno> turnos){
		turnosDAO.actualizarTurnos(turnos);
	}
	
	public List<Turno> obtenerTurnosEnFecha(Medico medico, Calendar fecha){
		return turnosDAO.obtenerTurnosEnFecha(medico, fecha);
	}
	
	public Turno obtenerTurnoEnFechaYhora(Medico medico, Calendar fecha){
		return turnosDAO.obtenerTurnoEnFechaYhora(medico, fecha);
	}
	
	public List<Turno> obtenerTurnosActuales(Medico medico){
		return turnosDAO.obtenerTurnosActuales(medico);
	}
	
	public void guardarPaciente(Paciente p){
		pacienteDAO.guardarPaciente(p);
	}
	
	public Calendar obtenerFechaMasLejanaDeTurnos(Medico m){
		return turnosDAO.obtenerFechaMasLejanaDeTurnos(m);
	}
	
	public void eliminarObraSocial(ObraSocial OS){
		obraSocialDAO.eliminarObraSocial(OS);
	}
	
	public void modificarObraSocial(ObraSocial OS){
		obraSocialDAO.modificarObraSocial(OS);
	}
	
	public void guardarObraSocial(ObraSocial obraSocial) {
		obraSocialDAO.guardarObraSocial(obraSocial);	
	}
	
	public List<ObraSocial> obtenerObrasSociales(){
		return obraSocialDAO.obtenerObrasSociales();
	}
	
	public void guardarMedico(Medico medico){
		medicoDAO.guardarMedico(medico);
	}
	
	public List<Medico> obtenerMedicos(){
		return medicoDAO.obtenerMedicos();
	}
	
	public List<Especialidad> obtenerEspecialidades (){
		return especialidadDAO.obtenerEspecialidades();	
	}

	public void guardarOModificarEspecialidades(List<Especialidad> especialidades){
		especialidadDAO.guardarOModificarEspecialidades(especialidades);
	}
	
	public List<Paciente> obtenerPacientes(){
		return pacienteDAO.obtenerPacientes();
	}

	public void eliminarEspcialidad(Especialidad especialidad) {
		especialidadDAO.eliminarEspecialidad(especialidad);
	}

	public void modificarEspecialidad(Especialidad especialidad) {
		especialidadDAO.modificarEspecialidad(especialidad);
	}

	public void guardarEspecialidad(Especialidad especialidad) {
		especialidadDAO.guardarEspecialidad(especialidad);		
	}

	public void eliminarMedico(Medico medico) {
		medicoDAO.eliminarMedico(medico);
	}

	public void modificarMedico(Medico medico) {
		medicoDAO.modificarMedico(medico);		
	}

	public void modificarPaciente(Paciente paciente) {
		pacienteDAO.modificarPaciente(paciente);
	}

	public void eliminarPaciente(Paciente paciente) {
		pacienteDAO.eliminarPaciente(paciente);
	}

	public void modificarAgenda(Agenda agenda) {
		agendaDAO.modificarAgenda(agenda);
	}
}
